﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using BLL.Services.Users;
using Web.Infrastructure.Models;

namespace Web.Models.Account
{
    public class RegisterModel : BaseModel, IValidatableObject
    {
        public RegisterModel()
        {
            Status = UserStatus.Active;
        }

        [Required(ErrorMessage = "Необходимо заполнить поле \'{0}\'!")]
        [RegularExpression(@"[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}", ErrorMessage = "Пожалуйста введите корректный Email адрес.")]
        [StringLength(256, MinimumLength = 3, ErrorMessage = "Поле \'{0}\' должно быть строкой с минимальной длинной {2} и максимальной длинной {1} символов.")]
        [Remote("Validate", "Account", AdditionalFields = "Login", ErrorMessage = "Пользователь с таким email или логином уже зарегистрирован.")]
        public string Email { get; set; }

        [UIHint("hidden")]
        public UserStatus Status { get; set; }

        [System.ComponentModel.DataAnnotations.Compare("ConfirmPassword")]
        [DataType(DataType.Password)]
        [Required(ErrorMessage = "Необходимо заполнить поле \'{0}\'!")]
        [Display(Name = "Пароль")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [System.ComponentModel.DataAnnotations.Compare("Password")]
        [Display(Name = "Подтверждение пароля")]
        [Required(ErrorMessage = "Необходимо заполнить поле \'{0}\'!")]
        public string ConfirmPassword { get; set; }

        [Display(Name = "Логин")]
        [Required(ErrorMessage = "Необходимо заполнить поле \'{0}\'!")]
        [StringLength(256)]
        [Remote("Validate", "Account", AdditionalFields = "Email", ErrorMessage = "Пользователь с таким email или логином уже зарегистрирован.")]
        public string Login { get; set; }

        public static explicit operator User(RegisterModel model)
        {
            var user = new User();
            ToEntity(model, user);
            if (user.RegistrationDate == DateTime.MinValue)
                user.RegistrationDate = DateTime.Now;
            if (!string.IsNullOrWhiteSpace(model.Password) && model.Password.Equals(model.ConfirmPassword))
                user.SetPassword(model.Password);
            user.Status = UserStatus.Active;
            return user;
        }

        protected static IUsersService UsersService
        {
            get
            {
                return DependencyResolver.Current.GetService<IUsersService>();
            }
        }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            var result = new List<ValidationResult>();
            if (Password != ConfirmPassword)
            {
                result.Add(new ValidationResult("Confirm Password and Password should match"));
            }
            if (!UsersService.ValidateUser(0, Email, Login))
            {
                result.Add(new ValidationResult("User with the same email or login already exists."));
            }
            return result;
        }
    }
}